package com.study.ApplicationEvent2.config;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.SmartApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import com.study.ApplicationEvent2.UserBean;
import com.study.ApplicationEvent2.UserRegisterEvent;
import com.study.ApplicationEvent2.service.UserService;

@Component
public class SmartUserRegisterListener implements SmartApplicationListener{

	@Override
	@Async
	
	/**
	 * 1. 如果注释掉@Async， 那么5s 后才打印SmartUserRegisterListener 注册成功, 用户名: admin, 密码： 1234567@EventListener注册信息，用户名:admin,密码: 1234567ApplicationListener 注册成功, 用户名: admin, 密码： 1234567
	 * 2. 如果加上@Async， 那么控制台会马上打印： @EventListener注册信息，用户名:admin,密码: 1234567ApplicationListener 注册成功, 用户名: admin, 密码： 1234567
	 * 5s 后才打印SmartUserRegisterListener 注册成功, 用户名: admin, 密码： 1234567
	 */
	public void onApplicationEvent(ApplicationEvent event) {
		try{
			Thread.sleep(5000);
		}catch(Exception e){
			e.printStackTrace();
		}
		//转换事件类型
		UserRegisterEvent userRegisterEvent = (UserRegisterEvent) event;
		//获取注册对象
		UserBean user = userRegisterEvent.getUser();
		
		//业务逻辑
		
		//输出注册信息
		System.out.format("SmartUserRegisterListener 注册成功, 用户名: %s, 密码： %s", user.getName(),user.getPassword());
				
		
	}

	@Override
	//同步情况下监听执行的顺序
	public int getOrder() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	/**
	 * 该方法返回true&supportsSourceType同样返回true时，才会调用该监听内的onApplicationEvent方法
	 * @param eventType 
	 */
	public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
		// TODO Auto-generated method stub
		return eventType == UserRegisterEvent.class;
	}

	@Override
	 /**
     *  该方法返回true&supportsEventType同样返回true时，才会调用该监听内的onApplicationEvent方法
     * @param sourceType
     * @return
     */
	public boolean supportsSourceType(Class<?> sourceType) {
		//只有在UserService内发布的UserRegisterEvent事件时才会执行下面逻辑
		return sourceType == UserService.class;
	}

	
}
